package Punto;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Observable;

import Operaciones.Constantes;

public class InfoPanel extends Observable implements Serializable{

		private static final long serialVersionUID = 1L;
		
		private ArrayList <Componente> lC_Group_Arrivals = new ArrayList <Componente> ();
		private ArrayList <Componente> lC_Group_Departure = new ArrayList <Componente> ();
		private ArrayList <Componente> lC_Group_Terminal = new ArrayList <Componente> ();
		private ArrayList <Componente> lC_Group_Punto = new ArrayList <Componente> ();

		public void setGrupo_Arrivals(ArrayList <Componente> lC_Group_Arrivals) {
			this.lC_Group_Arrivals = lC_Group_Arrivals;
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_LLEGADAS);
		}
		
		public void addGrupo_Arrivals(Componente pc) {
			// Primero buscamos si se encuentra ya dado de alta, para ponerlo a True, y si no se añade.
			Iterator <Componente> it = this.lC_Group_Arrivals.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pc.getGrupo().equals(c.getGrupo()) && pc.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pc.getEstado());
					// Hacemos una notificación a quien nos observan
					setChanged();
					notifyObservers(Constantes.GRUPO_LLEGADAS);
					return;
				}
			}
			// Entonces no se ha encontrado.
			this.lC_Group_Arrivals.add(pc);
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_LLEGADAS);
		}
		
		public void deleteGrupo_Arrivals(Componente pc) {
			Iterator <Componente> it = this.lC_Group_Arrivals.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pc.getGrupo().equals(c.getGrupo()) && pc.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pc.getEstado());
					break;
				}
			}
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_LLEGADAS);
		}

		public ArrayList <Componente> getlC_Group_Arrivals() {
			return lC_Group_Arrivals;
		}

		public void setGrupo_Departure(ArrayList <Componente> lC_Group_Departure) {
			this.lC_Group_Departure = lC_Group_Departure;
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_SALIDAS);
		}
		
		public void addGrupo_Departure(Componente pc) {
			// Primero buscamos si se encuentra ya dado de alta, para ponerlo a True, y si no se añade.
			Iterator <Componente> it = this.lC_Group_Departure.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pc.getGrupo().equals(c.getGrupo()) && pc.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pc.getEstado());
					// Hacemos una notificación a quien nos observan
					setChanged();
					notifyObservers(Constantes.GRUPO_SALIDAS);
					return;
				}
			}
			// Entonces no se ha encontrado.
			this.lC_Group_Departure.add(pc);
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_SALIDAS);
		}
		
		public void deleteGrupo_Departure(Componente pc) {
			Iterator <Componente> it = this.lC_Group_Departure.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pc.getGrupo().equals(c.getGrupo()) && pc.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pc.getEstado());
					break;
				}
			}
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_SALIDAS);
		}

		public ArrayList <Componente> getlC_Group_Departure() {
			return lC_Group_Departure;
		}
		
		public void setGrupo_Terminal(ArrayList <Componente> lC_Group_Terminal) {
			this.lC_Group_Terminal = lC_Group_Terminal;
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_TERMINAL);
		}

		public void addGrupo_Terminal(Componente pc) {
			// Primero buscamos si se encuentra ya dado de alta, para ponerlo a True, y si no se añade.
			Iterator <Componente> it = this.lC_Group_Terminal.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pc.getGrupo().equals(c.getGrupo()) && pc.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pc.getEstado());
					// Hacemos una notificación a quien nos observan
					setChanged();
					notifyObservers(Constantes.GRUPO_TERMINAL);
					return;
				}
			}
			// Entonces no se ha encontrado.
			this.lC_Group_Terminal.add(pc);
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_TERMINAL);
		}
		
		public void deleteGrupo_Terminal(Componente pc) {
			Iterator <Componente> it = this.lC_Group_Terminal.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pc.getGrupo().equals(c.getGrupo()) && pc.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pc.getEstado());
					break;
				}
			}
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_TERMINAL);
		}
		
		public ArrayList <Componente> getlC_Group_Terminal() {
			return lC_Group_Terminal;
		}
		
		
		public void setGrupo_Punto(ArrayList <Componente> lC_Group_Punto) {
			this.lC_Group_Punto = lC_Group_Punto;
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_PUNTO);
		}
		
		public void addGrupo_Punto(Componente pp) {
			// Primero buscamos si se encuentra ya dado de alta, para ponerlo a True, y si no se añade.
			Iterator <Componente> it = this.lC_Group_Punto.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pp.getGrupo().equals(c.getGrupo()) && pp.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pp.getEstado());
					// Hacemos una notificación a quien nos observan
					setChanged();
					notifyObservers(Constantes.GRUPO_PUNTO);
					return;
				}
			}
			// Entonces no se ha encontrado.
			this.lC_Group_Punto.add(pp);
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_PUNTO);
		}
		
		public void deleteGrupo_Punto(Componente pp) {
			Iterator <Componente> it = this.lC_Group_Punto.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (pp.getGrupo().equals(c.getGrupo()) && pp.getNombreComponente().equals(c.getNombreComponente())){
					c.setEstado(pp.getEstado());
					break;
				}
			}
			// Hacemos una notificación a quien nos observan
			setChanged();
			notifyObservers(Constantes.GRUPO_PUNTO);
		}

		public ArrayList <Componente> getlC_Group_Punto() {
			return lC_Group_Punto;
		}
		
		/////////////////////////////////////////////////////////////////
		// Métodos del info panel para darnos String en formato de texto.
		/////////////////////////////////////////////////////////////////
		public String toStringHTML_Arrival (){
			String text = "<html>";
			if (this.lC_Group_Arrivals.size() == 0)
				return Constantes.MENSAJE_NO_LLEGADA;
			
			Iterator <Componente> it = this.lC_Group_Arrivals.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (c.getEstado().equals(Constantes.FUNCIONANDO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=green>Funcionando</font><p>";
				else if (c.getEstado().equals(Constantes.APAGADO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=red>Averiado</font><p>";
				else if (c.getEstado().equals(Constantes.REPOSO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=#FBB117>Reposo</font><p>";
			}
			text += "</html>";
			return text;
		}
		
		public String toStringHTML_Departure (){
			String text = "<html>";
			if (this.lC_Group_Departure.size() == 0)
				return Constantes.MENSAJE_NO_SALIDA;
			
			Iterator <Componente> it = this.lC_Group_Departure.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (c.getEstado().equals(Constantes.FUNCIONANDO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=green>Funcionando</font><p>";
				else if (c.getEstado().equals(Constantes.APAGADO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=red>Averiado</font><p>";
				else if (c.getEstado().equals(Constantes.REPOSO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=#FBB117>Reposo</font><p>";
			}
			
			text += "</html>";
			return text;
		}
		
		public String toStringHTML_Terminal (){
			String text = "<html>";
			if (this.lC_Group_Terminal.size() == 0)
				return Constantes.MENSAJE_NO_TERMINAL;
			
			Iterator <Componente> it = this.lC_Group_Terminal.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (c.getEstado().equals(Constantes.FUNCIONANDO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=green>Funcionando</font><p>";
				else if (c.getEstado().equals(Constantes.APAGADO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=red>Averiado</font><p>";
				else if (c.getEstado().equals(Constantes.REPOSO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=#FBB117>Reposo</font><p>";
			}
			
			text += "</html>";
			return text;
		}
		
		public String toStringHTML_Punto (){
			String text = "<html>";
			if (this.lC_Group_Punto.size() == 0)
				return Constantes.MENSAJE_NO_PUNTO;
			
			Iterator <Componente> it = this.lC_Group_Punto.iterator();
			while (it.hasNext()){
				Componente c = it.next();
				if (c.getEstado().equals(Constantes.FUNCIONANDO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=green>Funcionando</font><p>";
				else if (c.getEstado().equals(Constantes.APAGADO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=red>Averiado</font><p>";
				else if (c.getEstado().equals(Constantes.REPOSO))
					text += c.getNombreComponente() + "&nbsp &nbsp &nbsp<font color=#FBB117>Reposo</font><p>";
			}
			
			text += "</html>";
			return text;
		}
		/////////////////////////////////////////////////////////////////
		// Fin del info panel para darnos String
		/////////////////////////////////////////////////////////////////
		
}
